// 给定一个二进制矩阵 A，我们想先水平翻转图像，然后反转图像并返回结果。

// 水平翻转图片就是将图片的每一行都进行翻转，即逆序。例如，水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。

// 反转图片的意思是图片中的 0 全部被 1 替换， 1 全部被 0 替换。例如，反转 [0, 1, 1] 的结果是 [1, 0, 0]。

// 示例 1:

// 输入: [[1,1,0],[1,0,1],[0,0,0]]
// 输出: [[1,0,0],[0,1,0],[1,1,1]]
// 解释: 首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]]；
//      然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]
// 示例 2:

// 输入: [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
// 输出: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
// 解释: 首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]；
//      然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
// 说明:

// 1 <= A.length = A[0].length <= 20
// 0 <= A[i][j] <= 1

#include <vector>

using namespace std;

class Solution {
public:
    vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
        int m = A.size();
        int n = A[0].size();
        vector<vector<int>> res(m);
        for (int i{0}; i < m; ++i) {
            for (int j = n - 1; j >= 0; --j) {
                res[i].push_back(!A[i][j]);
            }
        }
        return res;
    }
};

class Solution {
public:
    vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
        vector<vector<int>> ret{A};
        int m = A.size();
        int n = A[0].size();
        for (int i{0}; i < m; ++i) {
            int left{0};
            int right{n - 1};
            while (left <= right) {
                int temp = 1 - ret[i][left];
                ret[i][left] = 1 - ret[i][right];
                ret[i][right] = temp;
                ++left;
                --right;
            }
        }
        return ret;
    }
};